package com.example.czy.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.Arrays;
import java.util.Objects;

/**
 * OP 支持 常用类型：EQ、LK（LIKE）、LLK（LEFT LIKE）、RLK（RIGHT LIKE）、GT、LT、GE、LE、IN、NIN（NOT IN）、ES（EXISTS）、NES（NOT EXISTS）、BT（BETWEEN）、NBT（NOT BETWEEN）、INL（IS NULL）、NNL（NOT NULL） 等等
 * likes 多字段LIKE 适用于根据名称、描述 模糊查询场景
 * field 查询字段，可不带下划线，（可省略 默认为当前字段名）
 *
 * @author czy
 * @date 2022-8-20
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Query {

    /**
     * 查询字段，可不带下划线，（可省略 默认为当前字段名）
     */
    String field() default "";

    /**
     * 查询类型 默认EQUAL
     */
    Type type() default Type.EQ;


    /**
     * 多字段模糊搜索，英文逗号分割，字段可不带下划线
     */
    String likes() default "";

    enum Type {
        /**
         * EQUAL 等于
         */
        EQ("EQ"),
        EQ_SYMBOL("="),
        /**
         * GREATER THAN 大于
         */
        GT("GT"),
        GT_SYMBOL(">"),
        /**
         * LESS THAN 小于
         */
        LT("LT"),
        LT_SYMBOL("<"),
        /**
         * GREATER THAN OR EQUAL 大于等于
         */
        GE("GE"),
        GE_SYMBOL("≥"),
        GE_SYMBOL_SPLIT(">="),
        /**
         * LESS THAN OR EQUAL 小于等于
         */
        LE("LE"),
        LE_SYMBOL("≤"),
        LE_SYMBOL_SPLIT("<="),
        /**
         * 模糊 带XXX的
         */
        LIKE("LIKE"),
        /**
         * 等价 LIKE
         */
        LK("LK"),
        /**
         * 左模糊 后面带XXX的
         */
        LEFT_LIKE("LEFT_LIKE"),
        /**
         * 等价 LEFT_LIKE
         */
        LLK("LLK"),
        /**
         * 右模糊 前面带XXX的
         */
        RIGHT_LIKE("RIGHT_LIKE"),
        /**
         * 等价 RIGHT_LIKE
         */
        RLK("RLK"),
        /**
         * 不带XXX的
         */
        NOT_LIKE("NOT_LIKE"),
        /**
         * 等价 NOT_LIKE
         */
        NLK("NLK"),
        /**
         * 包含
         * 支持数组、集合、字符串逗号分割
         */
        IN("IN"),
        /**
         * 不包含
         * 支持数组、集合、字符串逗号分割
         */
        NOT_IN("NOT_IN"),
        /**
         * 等价 NOT_IN
         */
        NIN("NIN"),
        /**
         * 存在
         * 支持数组、集合、字符串逗号分割
         */
        EXISTS("EXISTS"),
        /**
         * 等价 EXISTS
         */
        ES("ES"),
        /**
         * 不存在
         * 支持数组、集合、字符串逗号分割
         */
        NOT_EXISTS("NOT_EXISTS"),
        /**
         * 等价 NOT_EXISTS
         */
        NES("NES"),
        /**
         * 不等于
         */
        NE("NE"),
        /**
         * 在...之间
         * 支持数组、集合、字符串逗号分割
         */
        BETWEEN("BETWEEN"),
        /**
         * 等价 BETWEEN
         */
        BT("BT"),
        /**
         * 不在...之间
         * 支持数组、集合、字符串逗号分割
         */
        NOT_BETWEEN("NOT_BETWEEN"),
        /**
         * 等价 NOT_BETWEEN
         */
        NBT("NBT"),
        /**
         * 不为空
         * 支持数组、集合、字符串逗号分割
         */
        NOT_NULL("NOT_NULL"),
        /**
         * 等价 NOT_NULL
         */
        NNL("NNL"),
        /**
         * 为空
         */
        IS_NULL("IS_NULL"),
        /**
         * 等价 IS_NULL
         */
        INL("IN"),

        ;

        Type(String name) {
            this.name = name;
        }

        private final String name;

        public String getName() {
            return name;
        }

        public static Type get(String value) {
            return Arrays.stream(Type.values()).filter(item -> Objects.equals(item.name, value)).findFirst().orElse(null);
        }


    }
}

